﻿using ExcellentProjectPlus.Seguridades.Atribuciones;
using AutoMapper;
using ExcellentProjectPlus.Dominio.Seguridades.Entidades;
using Servicios.Seguridad.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;

namespace Servicios.Seguridad.Controllers
{
    public class AtribucionesController : ApiController
    {
        #region Propiedades
        IServicioDeGestionDeAtribuciones _servicioDeGestionDeAtribuciones;
        #endregion

        #region Constructores
        public AtribucionesController(IServicioDeGestionDeAtribuciones servicioDeGestionDeAtribuciones)
        {
            _servicioDeGestionDeAtribuciones = servicioDeGestionDeAtribuciones;
            Mapper.CreateMap<Atribucion, AtribucionModel>();
           
        }
        #endregion

        public IHttpActionResult Get()
        {
            return Ok(Mapper.Map<IEnumerable<Atribucion>, IEnumerable<AtribucionModel>>
                (_servicioDeGestionDeAtribuciones.ObtenerAtribuciones()));
        }

        [ResponseType(typeof(AtribucionModel))]
        public IHttpActionResult GetAtribucion(int id)
        {
            Atribucion atribucion = _servicioDeGestionDeAtribuciones.ObtenerAtribucionPorId(id);
            if (atribucion == null)
            {
                return NotFound();
            }
            return Ok(Mapper.Map<Atribucion, AtribucionModel>(atribucion));
        }

        [ResponseType(typeof(Atribucion))]
        public IHttpActionResult Post(Atribucion atribucion)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            _servicioDeGestionDeAtribuciones.AgregarAtribucion(atribucion);

            return CreatedAtRoute("DefaultApi", new { id = atribucion.IdAtribucion }, atribucion);
        }

        public IHttpActionResult Put(int id, Atribucion atribucion)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != atribucion.IdAtribucion)
            {
                return BadRequest();
            }

            _servicioDeGestionDeAtribuciones.ModificarAtribucion(atribucion);

            return StatusCode(HttpStatusCode.NoContent);
        }

        [ResponseType(typeof(Atribucion))]
        public IHttpActionResult Delete(int id)
        {
            Atribucion atribucion = _servicioDeGestionDeAtribuciones.ObtenerAtribucionPorId(id);
            if (atribucion == null)
            {
                return NotFound();
            }

            _servicioDeGestionDeAtribuciones.EliminarAtribucion(atribucion);

            return Ok(atribucion);
        }

        private bool AtribucionExists(int id)
        {
            return _servicioDeGestionDeAtribuciones.ObtenerAtribucionPorId(id) != null;
        }
    }
}
